//package com.jzo2o.customer.service.impl;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.ArrayUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil;
//import com.jzo2o.api.customer.dto.request.EvaluationSubmitReqDTO;
//import com.jzo2o.api.customer.dto.request.ScoreItem;
//import com.jzo2o.api.orders.OrdersApi;
//import com.jzo2o.api.orders.OrdersServeApi;
//import com.jzo2o.api.orders.dto.response.OrderResDTO;
//import com.jzo2o.api.orders.dto.response.ServeProviderIdResDTO;
//import com.jzo2o.common.constants.UserType;
//import com.jzo2o.common.expcetions.ForbiddenOperationException;
//import com.jzo2o.common.model.CurrentUserInfo;
//import com.jzo2o.common.utils.UserContext;
//import com.jzo2o.customer.client.EvaluationHttpClient;
//import com.jzo2o.customer.model.domain.CommonUser;
//import com.jzo2o.customer.model.domain.ServeProvider;
//import com.jzo2o.customer.model.dto.EvaluationSubmitDTO;
//import com.jzo2o.customer.model.dto.RelationScoreDTO;
//import com.jzo2o.customer.model.dto.request.AuditReqDTO;
//import com.jzo2o.customer.model.dto.request.EvaluationPageByTargetReqDTO;
//import com.jzo2o.customer.model.dto.request.LikeOrCancelReqDTO;
//import com.jzo2o.customer.model.dto.response.*;
//import com.jzo2o.customer.properties.EvaluationProperties;
//import com.jzo2o.customer.service.EvaluationService;
//import com.jzo2o.customer.service.ICommonUserService;
//import com.jzo2o.customer.service.IServeProviderService;
//import org.springframework.cache.annotation.Cacheable;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.Collections;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * 评价服务 - 业务层
// *
// * @author itcast
// * @create 2023/9/11 16:19
// **/
//@Service
//public class EvaluationServiceImpl implements EvaluationService {
//    @Resource
//    private EvaluationHttpClient evaluationHttpClient;
//    @Resource
//    private EvaluationProperties evaluationProperties;
//    @Resource
//    private OrdersApi ordersApi;
//    @Resource
//    private OrdersServeApi ordersServeApi;
//    @Resource
//    private IServeProviderService serveProviderService;
//    @Resource
//    private ICommonUserService commonUserService;
//
//    /**
//     * 默认评价内容
//     */
//    private static final String DEFAULT_EVALUATION = "此用户没有填写评价，系统默认好评";
//
//    /**
//     * 默认匿名状态，0：不匿名，1：匿名
//     */
//    private static final Integer DEFAULT_ANONYMOUS_STATUS = 1;
//
//    /**
//     * 发表评价
//     *
//     * @param evaluationSubmitReqDTO 发表评价请求体
//     */
//    @Override
//    public BooleanResDTO submit(EvaluationSubmitReqDTO evaluationSubmitReqDTO) {
//        //校验订单状态
//        OrderResDTO orderResDTO = ordersApi.queryById(evaluationSubmitReqDTO.getOrdersId());
//        if (ObjectUtil.notEqual(orderResDTO.getOrdersStatus(), 400)) {
//            throw new ForbiddenOperationException("非待评价状态不可评价");
//        }
//
//        CurrentUserInfo currentUserInfo = evaluationSubmitReqDTO.getCurrentUserInfo();
//
//
//        //发送服务项评价
//        EvaluationResDTO serveItemEvaluationResDTO = queryByTargetTypeIdAndOrdersId(UserContext.currentUser(), evaluationProperties.getServeItem().getTargetTypeId(), evaluationSubmitReqDTO.getOrdersId());
//        //针对该订单如果没有发表过该服务的评价才进行提交数据
//        if (null == serveItemEvaluationResDTO) {
//            requestSubmitServeItemEvaluation(evaluationSubmitReqDTO, currentUserInfo);
//        }
//
//        //发送服务人员/机构评价
//        EvaluationResDTO serveProviderEvaluationResDTO = queryByTargetTypeIdAndOrdersId(UserContext.currentUser(), evaluationProperties.getServeProvider().getTargetTypeId(), evaluationSubmitReqDTO.getOrdersId());
//        //针对该订单如果没有发表过该师傅的评价才进行提交数据
//        if (null == serveProviderEvaluationResDTO) {
//            requestSubmitServeProviderEvaluation(evaluationSubmitReqDTO, currentUserInfo);
//        }
//
//        //根据订单id评价
//        ordersApi.evaluate(evaluationSubmitReqDTO.getOrdersId());
//
//        return new BooleanResDTO(true);
//    }
//
//    /**
//     * 请求发送服务项评价
//     *
//     * @param evaluationSubmitReqDTO 评价请求数据
//     * @param currentUserInfo        当前用户数据
//     */
//    private void requestSubmitServeItemEvaluation(EvaluationSubmitReqDTO evaluationSubmitReqDTO, CurrentUserInfo currentUserInfo) {
//
//        //发表评价url
//        String url = evaluationProperties.getDomain() + "/common/evaluations";
//
//        //查询订单
//        OrderResDTO orderResDTO = ordersApi.queryById(evaluationSubmitReqDTO.getOrdersId());
//
//        //组装评价数据
//        EvaluationSubmitDTO evaluationSubmitDTO = new EvaluationSubmitDTO();
//        evaluationSubmitDTO.setRelationId(orderResDTO.getId().toString());
//        evaluationSubmitDTO.setTargetId(orderResDTO.getServeItemId().toString());
//        evaluationSubmitDTO.setTargetName(orderResDTO.getServeItemName());
//        evaluationSubmitDTO.setIsAnonymous(evaluationSubmitReqDTO.getIsAnonymous());
//        evaluationSubmitDTO.setContent(evaluationSubmitReqDTO.getServeItemEvaluationContent());
//        evaluationSubmitDTO.setPictureArray(evaluationSubmitReqDTO.getServeItemPictureArray());
//
//        //组装评分数据
//        evaluationSubmitDTO.setScoreArray(evaluationSubmitReqDTO.getServeItemScoreItems());
//
//        //组装请求参数
//        Map<String, Object> serveItemEvaluationParametersMap = new HashMap<>();
//        serveItemEvaluationParametersMap.put("targetTypeId", evaluationProperties.getServeItem().getTargetTypeId());
//
//        //发送请求
//        evaluationHttpClient.post(currentUserInfo, url, serveItemEvaluationParametersMap, evaluationSubmitDTO);
//    }
//
//    /**
//     * 请求发送服务人员/机构评价
//     *
//     * @param evaluationSubmitReqDTO 评价请求数据
//     * @param currentUserInfo        当前用户数据
//     */
//    private void requestSubmitServeProviderEvaluation(EvaluationSubmitReqDTO evaluationSubmitReqDTO, CurrentUserInfo currentUserInfo) {
//        //发表评价url
//        String url = evaluationProperties.getDomain() + "/common/evaluations";
//
//        //查询服务人员/机构
//        ServeProviderIdResDTO serveProviderIdResDTO = ordersServeApi.queryServeProviderIdByOrderId(evaluationSubmitReqDTO.getOrdersId());
//        ServeProvider serveProvider = serveProviderService.getById(serveProviderIdResDTO.getServeProviderId());
//
//        //组装评价数据
//        EvaluationSubmitDTO evaluationSubmitDTO = new EvaluationSubmitDTO();
//        evaluationSubmitDTO.setRelationId(evaluationSubmitReqDTO.getOrdersId().toString());
//        evaluationSubmitDTO.setTargetId(serveProvider.getId().toString());
//        evaluationSubmitDTO.setTargetName(serveProvider.getName());
//        evaluationSubmitDTO.setIsAnonymous(evaluationSubmitReqDTO.getIsAnonymous());
//        evaluationSubmitDTO.setContent(evaluationSubmitReqDTO.getServeProviderEvaluationContent());
//
//        //组装评分数据
//        evaluationSubmitDTO.setScoreArray(evaluationSubmitReqDTO.getServeProviderScoreItems());
//
//        //组装请求参数
//        Map<String, Object> serveItemEvaluationParametersMap = new HashMap<>();
//        serveItemEvaluationParametersMap.put("targetTypeId", evaluationProperties.getServeProvider().getTargetTypeId());
//
//        //发送请求
//        evaluationHttpClient.post(currentUserInfo, url, serveItemEvaluationParametersMap, evaluationSubmitDTO);
//    }
//
//    /**
//     * 根据对象属性分页查询评价列表
//     *
//     * @param evaluationPageByTargetReqDTO 分页查询请求体
//     * @return 分页结果
//     */
//    @Override
//    public List<EvaluationResDTO> pageByTarget(EvaluationPageByTargetReqDTO evaluationPageByTargetReqDTO) {
//        CurrentUserInfo currentUserInfo = UserContext.currentUser();
//
//        //如果是用户端请求，查询的评价为服务项评价
//        if (ObjectUtil.equal(UserType.C_USER, currentUserInfo.getUserType())) {
//            evaluationPageByTargetReqDTO.setTargetTypeId(evaluationProperties.getServeItem().getTargetTypeId());
//        }
//
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/evaluations/pageByTargetId";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = BeanUtil.beanToMap(evaluationPageByTargetReqDTO);
//        //只查询好评
//        parameterMap.put("scoreLevel", 3);
//
//        //向评价系统发送http请求
//        String jsonResult = evaluationHttpClient.get(currentUserInfo, url, parameterMap);
//
//        //解析响应结果
//        return JSONUtil.parseObj(jsonResult).getJSONObject("data").getJSONArray("list").toList(EvaluationResDTO.class);
//    }
//
//    /**
//     * 删除评价
//     *
//     * @param id 评价id
//     */
//    @Override
//    public void delete(String id) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/evaluations/" + id;
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("targetTypeId", evaluationProperties.getServeItem().getTargetTypeId());
//
//        //向评价系统发送http请求
//        evaluationHttpClient.delete(UserContext.currentUser(), url, parameterMap);
//    }
//
//    /**
//     * 点赞或取消点赞
//     *
//     * @param likeOrCancelReqDTO 点赞请求数据
//     */
//    @Override
//    public void likeOrCancel(LikeOrCancelReqDTO likeOrCancelReqDTO) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/likes";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("targetTypeId", evaluationProperties.getServeItem().getTargetTypeId());
//
//        //向评价系统发送http请求
//        evaluationHttpClient.post(UserContext.currentUser(), url, parameterMap, likeOrCancelReqDTO);
//    }
//
//    /**
//     * 用户举报
//     *
//     * @param auditReqDTO 举报请求
//     */
//    @Override
//    public void userReport(AuditReqDTO auditReqDTO) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/audit";
//
//        //组装请求体
//        auditReqDTO.setTargetTypeId(evaluationProperties.getServeItem().getTargetTypeId());
//
//        //向评价系统发送http请求
//        evaluationHttpClient.post(UserContext.currentUser(), url, null, auditReqDTO);
//    }
//
//    /**
//     * 分页查询当前用户评价列表
//     *
//     * @param pageNo   页码，默认为1
//     * @param pageSize 页面大小，默认为10
//     * @return 当前用户评价列表
//     */
//    @Override
//    public List<EvaluationAndOrdersResDTO> pageByCurrentUser(Integer pageNo, Integer pageSize) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/evaluations/pageByEvaluatorId";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("pageNo", pageNo);
//        parameterMap.put("pageSize", pageSize);
//        parameterMap.put("targetTypeId", evaluationProperties.getServeItem().getTargetTypeId());
//        parameterMap.put("evaluatorId", UserContext.currentUserId());
//
//        //向评价系统发送http请求
//        String jsonResult = evaluationHttpClient.get(UserContext.currentUser(), url, parameterMap);
//
//        //解析响应数据
//        if (ObjectUtil.isEmpty(JSONUtil.parseObj(jsonResult).getJSONObject("data").getJSONArray("list"))) {
//            return Collections.emptyList();
//        }
//        List<EvaluationAndOrdersResDTO> list = JSONUtil.parseObj(jsonResult).getJSONObject("data").getJSONArray("list").toList(EvaluationAndOrdersResDTO.class);
//
//        //筛选出订单id，批量查询订单详情
//        List<Long> orderIds = list.stream().map(e -> Long.valueOf(e.getRelationId())).distinct().collect(Collectors.toList());
//        List<OrderResDTO> orderResDTOList = ordersApi.queryByIds(orderIds);
//        Map<Long, OrderResDTO> ordersMap = orderResDTOList.stream().collect(Collectors.toMap(OrderResDTO::getId, o -> o));
//
//        //组装订单数据
//        list.forEach(e -> {
//            Long ordersId = Long.valueOf(e.getRelationId());
//            e.setServeStartTime(ordersMap.get(ordersId).getServeStartTime());
//            e.setServeAddress(ordersMap.get(ordersId).getServeAddress());
//            e.setServeItemImg(ordersMap.get(ordersId).getServeItemImg());
//        });
//        return list;
//    }
//
//
//    /**
//     * 根据评价等级分页查询当前用户评价列表
//     *
//     * @param scoreLevel 评价等级，1差评，2中评，3好评
//     * @param pageNo     页码
//     * @param pageSize   页面大小
//     * @return 评价列表
//     */
//    @Override
//    public List<EvaluationAndOrdersResDTO> pageByCurrentUserAndScoreLevel(Integer scoreLevel, Integer pageNo, Integer pageSize) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/evaluations/pageByTargetId";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("pageNo", pageNo);
//        parameterMap.put("pageSize", pageSize);
//        parameterMap.put("targetTypeId", evaluationProperties.getServeProvider().getTargetTypeId());
//        parameterMap.put("targetId", UserContext.currentUserId());
//        parameterMap.put("sortBy", 1);  //固定按评价时间排序
//
//        if (ObjectUtil.isNotEmpty(scoreLevel)) {
//            parameterMap.put("scoreLevel", scoreLevel);
//        }
//
//        //向评价系统发送http请求
//        String jsonResult = evaluationHttpClient.get(UserContext.currentUser(), url, parameterMap);
//
//        //解析响应数据
//        List<EvaluationAndOrdersResDTO> list = JSONUtil.parseObj(jsonResult).getJSONObject("data").getJSONArray("list").toList(EvaluationAndOrdersResDTO.class);
//        if (CollUtil.isEmpty(list)) {
//            return list;
//        }
//
//        //筛选出订单id，批量查询订单详情
//        List<Long> orderIds = list.stream().map(e -> Long.valueOf(e.getRelationId())).distinct().collect(Collectors.toList());
//        List<OrderResDTO> orderResDTOList = ordersApi.queryByIds(orderIds);
//        Map<Long, OrderResDTO> ordersMap = orderResDTOList.stream().collect(Collectors.toMap(OrderResDTO::getId, o -> o));
//
//        //组装订单数据
//        list.forEach(e -> {
//            Long ordersId = Long.valueOf(e.getRelationId());
//            e.setServeStartTime(ordersMap.get(ordersId).getServeStartTime());
//            e.setServeAddress(ordersMap.get(ordersId).getServeAddress());
//            e.setServeItemImg(ordersMap.get(ordersId).getServeItemImg());
//        });
//        return list;
//    }
//
//    /**
//     * 根据订单id列表查询师傅评分
//     *
//     * @param orderIds 订单id列表
//     * @return 评分
//     */
//    @Override
//    public Map<String, Double> queryServeProviderScoreByOrdersId(List<Long> orderIds) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/admin/evaluations/findScoreByRelationIds";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("targetTypeId", evaluationProperties.getServeProvider().getTargetTypeId());
//        List<String> ordersIdStr = orderIds.stream().map(String::valueOf).collect(Collectors.toList());
//        parameterMap.put("relationIds", String.join(",", ordersIdStr));
//
//        //向评价系统发送http请求
//        CurrentUserInfo currentUserInfo = new CurrentUserInfo(1L, "", "", UserType.OPERATION);
//        String jsonResult = evaluationHttpClient.get(currentUserInfo, url, parameterMap);
//
//        List<RelationScoreDTO> scoreList = JSONUtil.parseObj(jsonResult).getJSONArray("data").toList(RelationScoreDTO.class);
//        //解析响应数据
//
//        return scoreList.stream().collect(Collectors.toMap(RelationScoreDTO::getRelationId, RelationScoreDTO::getScore));
//    }
//
//    /**
//     * 获取评价系统信息
//     *
//     * @return 评价系统信息
//     */
//    @Override
//    public EvaluationTokenDto getEvaluationInfo() {
//        return new EvaluationTokenDto(evaluationHttpClient.generateToken(UserContext.currentUser()));
//    }
//
//    /**
//     * 根据对象类型和订单id查询评价
//     *
//     * @param targetTypeId 对象类型id
//     * @param ordersId     订单id
//     * @return 评价
//     */
//    @Override
//    public EvaluationResDTO queryByTargetTypeIdAndOrdersId(CurrentUserInfo currentUserInfo, String targetTypeId, Long ordersId) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/evaluations/findByRelationId";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("targetTypeId", targetTypeId);
//        parameterMap.put("relationId", ordersId.toString());
//
//        //向评价系统发送http请求
//        String jsonResult = evaluationHttpClient.get(currentUserInfo, url, parameterMap);
//
//        //解析响应数据
//        JSONObject jsonObject = JSONUtil.parseObj(jsonResult).getJSONObject("data");
//        if (null == jsonObject) {
//            return null;
//        }
//        return jsonObject.toBean(EvaluationResDTO.class);
//    }
//
//    /**
//     * 根据对象类型id查询评价配置信息
//     *
//     * @return 评价配置信息
//     */
//    private EvaluationSystemInfoResDTO findSystemInfo(String targetTypeId, CurrentUserInfo currentUserInfo) {
//        //请求url
//        String url = evaluationProperties.getDomain() + "/common/systems/info";
//
//        //封装请求参数
//        Map<String, Object> parameterMap = new HashMap<>();
//        parameterMap.put("targetTypeId", targetTypeId);
//
//        //向评价系统发送http请求
//        String jsonResult = evaluationHttpClient.get(currentUserInfo, url, parameterMap);
//
//        //解析响应数据
//        JSONObject jsonObject = JSONUtil.parseObj(jsonResult).getJSONObject("data");
//        if (null == jsonObject) {
//            throw new ForbiddenOperationException("查询不到配置信息");
//        }
//        return jsonObject.toBean(EvaluationSystemInfoResDTO.class);
//    }
//
//    /**
//     * 查询所有的评价配置信息
//     *
//     * @return 评价配置信息
//     */
//    @Override
//    @Cacheable(value = "JZ_CACHE", key = "'ALL_EVALUATION_CONFIG'", cacheManager = "cacheManagerOneDay")
//    public AllEvaluationSystemInfoResDTO findAllSystemInfo(CurrentUserInfo currentUserInfo) {
//        //查询服务项配置信息
//        EvaluationSystemInfoResDTO serveItemSystemInfo = findSystemInfo(evaluationProperties.getServeItem().getTargetTypeId(), currentUserInfo);
//
//        //查询师傅配置信息
//        EvaluationSystemInfoResDTO serveProviderSystemInfo = findSystemInfo(evaluationProperties.getServeProvider().getTargetTypeId(), currentUserInfo);
//        if (null == serveItemSystemInfo || null == serveProviderSystemInfo) {
//            throw new ForbiddenOperationException("查询不到配置信息");
//        }
//        return new AllEvaluationSystemInfoResDTO(serveItemSystemInfo, serveProviderSystemInfo);
//    }
//
//    /**
//     * 自动评价
//     *
//     * @param evaluationSubmitReqDTO 评价信息
//     */
//    @Override
//    public void autoEvaluate(EvaluationSubmitReqDTO evaluationSubmitReqDTO) {
//        //1.查询当前用户信息
//        CommonUser commonUser = commonUserService.getById(evaluationSubmitReqDTO.getUserId());
//        CurrentUserInfo currentUserInfo = new CurrentUserInfo(commonUser.getId(), commonUser.getNickname(), commonUser.getAvatar(), UserType.C_USER);
//
//        //2.获取配置信息
//        AllEvaluationSystemInfoResDTO allSystemInfo = findAllSystemInfo(currentUserInfo);
//
//        //3.封装服务项默认评分数据
//        List<EvaluationSystemInfoResDTO.ScoreConfig> serveItemScoreConfigList = allSystemInfo.getServeItemEvaluationSystemInfo().getEvaluationConfig().getScoreConfigList();
//        List<ScoreItem> serveItemScoreList = serveItemScoreConfigList.stream()
//                .filter(EvaluationSystemInfoResDTO.ScoreConfig::getEnabled)
//                .map(s -> ScoreItem.defaultScoreItem(s.getItemId(), s.getItemName()))
//                .collect(Collectors.toList());
//
//        //4.封装师傅默认评分数据
//        List<EvaluationSystemInfoResDTO.ScoreConfig> serveProviderScoreConfigList = allSystemInfo.getServeProviderEvaluationSystemInfo().getEvaluationConfig().getScoreConfigList();
//        List<ScoreItem> serveProviderScoreList = serveProviderScoreConfigList.stream()
//                .filter(EvaluationSystemInfoResDTO.ScoreConfig::getEnabled)
//                .map(s -> ScoreItem.defaultScoreItem(s.getItemId(), s.getItemName()))
//                .collect(Collectors.toList());
//
//
//        //5.封装默认评价内容、默认评分、默认匿名信息
//        evaluationSubmitReqDTO.setServeItemEvaluationContent(DEFAULT_EVALUATION);
//        evaluationSubmitReqDTO.setServeItemScoreItems(ArrayUtil.toArray(serveItemScoreList, ScoreItem.class));
//        evaluationSubmitReqDTO.setServeProviderEvaluationContent(DEFAULT_EVALUATION);
//        evaluationSubmitReqDTO.setServeProviderScoreItems(ArrayUtil.toArray(serveProviderScoreList, ScoreItem.class));
//        evaluationSubmitReqDTO.setIsAnonymous(DEFAULT_ANONYMOUS_STATUS);
//
//        //6.发送服务项评价
//        EvaluationResDTO serveItemEvaluationResDTO = queryByTargetTypeIdAndOrdersId(currentUserInfo, evaluationProperties.getServeItem().getTargetTypeId(), evaluationSubmitReqDTO.getOrdersId());
//        //针对该订单如果没有发表过该服务的评价才进行提交数据
//        if (null == serveItemEvaluationResDTO) {
//            requestSubmitServeItemEvaluation(evaluationSubmitReqDTO, currentUserInfo);
//        }
//
//        //7.发送服务人员/机构评价
//        EvaluationResDTO serveProviderEvaluationResDTO = queryByTargetTypeIdAndOrdersId(currentUserInfo, evaluationProperties.getServeProvider().getTargetTypeId(), evaluationSubmitReqDTO.getOrdersId());
//        //针对该订单如果没有发表过该师傅的评价才进行提交数据
//        if (null == serveProviderEvaluationResDTO) {
//            requestSubmitServeProviderEvaluation(evaluationSubmitReqDTO, currentUserInfo);
//        }
//    }
//}
